#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <assert.h>
#include <fstream>
#include <time.h>


void RGB_filter(int tam_pixels, char *imagem, int max, clock_t *start, clock_t *end)
{
	int k = 0;
	int j = 0;
	char pixel;
	*start = clock();

	__asm mov esi, imagem                         // esi aponta para o inicio da imagem
	for (int i = 0; i < tam_pixels; i++)
	{
		                                         // para cada pixel da imagem pega os valores dos canais RGB daquele pixel e aplica o filtro no mesmo
		__asm {
				movzx eax, BYTE PTR[esi]       // move para eax o canal R de um pixel
				movzx ebx, BYTE PTR[esi+1]     // move para ebx o canal G de um pixel
				movzx ecx, BYTE PTR[esi+2]     // move para ecx o canal B de um pixel
				add esi, 3                     // esi aponta pro endereço do próximo pixel
				add eax, ebx
				add eax, ecx
				cmp eax, max                   // max (381 = 127*3) é o parâmetro de comparação que definirá se o pixel será convertido para branco ou preto
				JA BRANCO                      // se o valor do pixel é maior do que 127 converte o pixel para branco, caso contrário converte para preto
				mov pixel, 000h                // converte o pixel para preto
				Jmp Fim
		BRANCO: 
				mov pixel, 0FFh                // converte o pixel para branco
		Fim:
		}

		imagem[j++] = pixel;                    //atualiza a imagem
		imagem[j++] = pixel;
		imagem[j++] = pixel;
	}
	*end = clock();
}
int main(int argc, char * argv[])
{
	clock_t start, end;
	double cpu_time_used;

	FILE *fInput, *fOutput;
	char cabecalho[10], *imagem;
	int tam_pixels;
	int line, column, depth;
	int max = 381;                                                       //max = (127*3) assim não precisamos realizar uma divisão na conversão dos pixels

	if (argc < 3) {
		printf("Usage: %s input output", argv[0]);
		exit(1);
	}

	fInput = fopen(argv[1], "rb");
	if (!fInput) {
		printf("File %s not found!", argv[1]);
		exit(1);
	}

	fOutput = fopen(argv[2], "wb");
	if (!fOutput) {
		printf("Unable to create file %s!", argv[2]);
		exit(1);
	}

	fgets(cabecalho, 10, fInput);
	fscanf(fInput, "%d %d %d\n", &line, &column, &depth);                // faz a leitura das dimensões da imagem (largura e altura) e do tipo de cores utilizadas

	tam_pixels = line*column;                                            // a imagem possui nº de pixels = largura*altura

	imagem = (char*)malloc((tam_pixels * 3)*sizeof(char));               // é necessário alocar um buffer de tamanho 3 vezes maior que o número de pixels da imagem
														    // pois cada pixel contém informações sobre os canais RGB
	
     fread(&imagem[0], sizeof(char), tam_pixels * 3, fInput);             // faz a leitura da imagem
  
     RGB_filter(tam_pixels, imagem, max, &start, &end);                   // chama a função que aplica o filtro na imagem



	//gravacao do arquivo de saida
	fputs(cabecalho, fOutput);
	fprintf(fOutput, "%d %d %d\n", line, column, depth);
	fwrite(&imagem[0], sizeof(char), tam_pixels * 3, fOutput);

  
	fclose(fInput);
	fclose(fOutput);
     free(imagem);
	

	cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
	fprintf(stderr, "tempo = %f segundos\n", cpu_time_used);

	return 0;
}